Christian Tismer [Fri, 20 Aug 2021 16:18:57 +0000 (18:18 +0200)]
py3.10-prep: Fix a very old refcounting error in time_test.py
Since 2012-03-08, there was a refcounting error in
the typesystem_sample.xml file at <value-type name="Time">.
The boolean function results were not refcounted.
This bug was hard to find because nobody expects a failure in the
testing code, and the error shows up at the very end in the
finalization code, totally unrelated to the error location.
In order to find it, the setting `PYTHONMALLOC=malloc` was needed,
because otherwise we got a Python memory dump but no traceback.
Then, Python was modified and code was inserted in the various
involved `code_dealloc`, `tupledealloc` and `object_dealloc`
functions that printed the involved refcounts and types before
performing the actual deallocation.
This bug actually was of no harm since only the wrong test was
involved. It was very misleading because there were quite some
changes to the `datetime` module in Python 3.10. But the bug
was nothing but a dormant refcounting error.
After the major problems are solved in
py3.10-prep: re-implement zip import
py3.10-prep: reset the type cache after feature switching
py3.10-prep: Fix parser.py for changed typing module
, there are only some minor changes left to do. One thing
is still not clear:
* Unsolved: In time_test.py, the last two tests work but
crash at shutdown.
It is not yet clear if this is a PySide or Python error.
This will crash Python 3.10 if not solved until the release.
py3.10-prep: Fix parser.py for changed typing module
The typing module has subtle changes that are not even
documented: Typing types now have a __name__ attribute.
That confused the parser of the pyi generator because
suddenly stingizing
Callable[..., Optional[str]]
resulted in
Callable[..., Optional]
because of special rules that return the generic name
of a typing type, which was very unexpected. Finding this bug
took a lot of debugging of the recursive `_resolve_type`
function.
py3.10-prep: reset the type cache after feature switching
When using feature switching in Python 3.10, there were
funny effects where switched and un-switched versions appeared
to co-exist.
It turned out that we were hit by function caching that
is now implemented for the LOAD_ATTR opcode.
It was not known that caching would happen at all for
PySide classes because we don't use Py_TPFLAGS_VALID_VERSION_TAG.
But actually, this flag is used internally by Python to do some
optimizations, and we just have to notify the interpreter of
type changes by PyType_Modified().
Christian Tismer [Wed, 23 Dec 2020 11:28:16 +0000 (13:28 +0200)]
qApp: fix flag handling in Python 3.8+ and a Python 3.9 issue
This is an old problem that was solved for Python 2.7.
From Python 3.8 on, the behavior is the same with Python 3.
The fix finally was to extend a Python 2.7 patch to Python 3
as well. See the Jira issue for details.
This patch includes also a small patch that was mentioned as
necessary for Python 3.9: Python issue 40217. I have seen no
effect of this change yet but applied the patch, anyway.
Dmitry Shachnev [Wed, 16 Dec 2020 17:26:18 +0000 (20:26 +0300)]
Pass --reuse-build only to commands that use DistUtilsCommandMixin
This is a concatenation of two upstream commits:
- https://code.qt.io/cgit/pyside/pyside-setup.git/commit/?id=ed0571df854a232e
- https://code.qt.io/cgit/pyside/pyside-setup.git/commit/?id=3f00c2adad2e38b0